﻿////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// <copyright>Copyright 2008-2011 Andreas Huber Doenni</copyright>
// Distributed under the GNU General Public License version 2 (GPLv2).
// See accompanying file License.txt or copy at http://phuse.codeplex.com/license.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

namespace Phuse.Mime
{
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;

    /// <summary>Represents a grouping of header fields.</summary>
    internal sealed class HeaderFieldGrouping : IGrouping<string, HeaderField>
    {
        private readonly string key;
        private readonly List<HeaderField> elements = new List<HeaderField>();

        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>See <see cref="IGrouping{T, U}.Key"/>.</summary>
        public string Key
        {
            get { return this.key; }
        }

        /// <summary>See <see cref="IEnumerable{T}.GetEnumerator"/>.</summary>
        public IEnumerator<HeaderField> GetEnumerator()
        {
            return this.elements.GetEnumerator();
        }

        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>See <see cref="IEnumerable.GetEnumerator"/>.</summary>
        IEnumerator IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }

        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        internal HeaderFieldGrouping(string key)
        {
            this.key = key;
        }

        internal int Count
        {
            get { return this.elements.Count; }
        }

        internal void Add(HeaderField item)
        {
            this.elements.Add(item);
        }

        internal bool Remove(HeaderField item)
        {
            return this.elements.Remove(item);
        }
    }
}
